home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-08-21 | 4.0 KB | 154 lines | [TEXT/PJMM] |
- unit GetNodeTable;
-
-
- interface
-
- uses
- ParserGlobals, StringStuff, GetTokenTypes, Parser, GetFunctionPlaces;
-
- procedure getnodetable (var nodetable: hdlnoderecord; var nodepointer: integer; var error: str255; var store: boolean; var save: array2);
-
-
- implementation
-
-
- procedure getnodetable;
-
- label
- 991, 999;
-
- type
-
- placetype = record
- typetoken: stringsize;
- pos: integer;
- strt: integer;
- stp: integer;
- end;
- ptrplacetype = ^placetype;
- hdlplacetype = ^ptrplacetype;
-
- var
- i, j, k, l, m, jtot, ktot, numnodeplaces: integer;
- numplaces: hdlintarray0;
- sysub: hdlstringarray0;
- subtokentype: hdlstringarray0;
- nst, nend: hdlintarray0;
- nodeplace: array[1..maxnumberofnodes] of hdlplacetype;
- subpr: hdlintarray0;
-
- begin
-
- nodepointer := 0;
-
- numplaces := hdlintarray0(NewHandle(SizeOf(intarray0)));
- nst := hdlintarray0(NewHandle(SizeOf(intarray0)));
- nend := hdlintarray0(NewHandle(SizeOf(intarray0)));
-
- sysub := hdlstringarray0(NewHandle(SizeOf(stringarray0)));
- subtokentype := hdlstringarray0(NewHandle(SizeOf(stringarray0)));
- subpr := hdlintarray0(NewHandle(SizeOf(intarray0)));
-
- getfunctionplaces(numnodeplaces, numplaces, nst, nend);
-
- for j := 1 to numnodeplaces do
- begin
- nodeplace[j] := hdlplacetype(NewHandle(SizeOf(placetype)));
- nodeplace[j]^^.typetoken := tokentype^^[numplaces^^[j]];
- nodeplace[j]^^.pos := numplaces^^[j];
- nodeplace[j]^^.strt := nst^^[j];
- nodeplace[j]^^.stp := nend^^[j];
- end;
-
- for m := 1 to numnodeplaces do
- begin
- i := numnodeplaces + 1 - m;
- ktot := nodeplace[i]^^.stp + 1 - nodeplace[i]^^.strt;
- for j := nodeplace[i]^^.strt to nodeplace[i]^^.stp do
- begin
- k := j + 1 - nodeplace[i]^^.strt;
- l := k + nodeplace[i]^^.pos;
-
- sysub^^[k] := sy^^[l];
- subtokentype^^[k] := tokentype^^[l];
- subpr^^[k] := pr^^[l];
- end;
-
- sysub^^[0] := sy^^[0];
- subtokentype^^[0] := tokentype^^[0];
- subpr^^[0] := pr^^[0];
-
- ktot := ktot + 1;
- sysub^^[ktot] := sy^^[ntot];
- subtokentype^^[ktot] := tokentype^^[ntot];
- subpr^^[ktot] := pr^^[ntot];
-
-
- if ktot = 2 then
- begin
- nodepointer := nodepointer + 1;
- nodetable^^[nodepointer].optype := 'unary';
- nodetable^^[nodepointer].loptype := tokentype^^[nodeplace[i]^^.strt];
- nodetable^^[nodepointer].roptype := tokentype^^[nodeplace[i]^^.strt];
- nodetable^^[nodepointer].op.index := plus;
- nodetable^^[nodepointer].lop.index := sy^^[nodeplace[i]^^.strt];
- nodetable^^[nodepointer].rop.index := sy^^[nodeplace[i]^^.strt];
- goto 991;
- end;
-
- parser(sysub, subtokentype, subpr, nodetable, nodepointer, error);
-
- if error <> '' then
- goto 999;
-
- 991:
- nodepointer := nodepointer + 1;
- nodetable^^[nodepointer].optype := nodeplace[i]^^.typetoken;
- nodetable^^[nodepointer].loptype := 'node';
- nodetable^^[nodepointer].roptype := 'node';
- nodetable^^[nodepointer].op.index := sy^^[nodeplace[i]^^.pos];
- nodetable^^[nodepointer].lop.index := stringof(nodepointer - 1);
- nodetable^^[nodepointer].rop.index := stringof(nodepointer - 1);
-
- sy^^[nodeplace[i]^^.pos] := stringof(nodepointer);
- tokentype^^[nodeplace[i]^^.pos] := 'node';
- pr^^[nodeplace[i]^^.pos] := 0;
-
- for j := nodeplace[i]^^.stp + 1 to ntot do
- begin
- k := j - nodeplace[i]^^.stp;
- sy^^[k + nodeplace[i]^^.pos] := sy^^[j];
- tokentype^^[k + nodeplace[i]^^.pos] := tokentype^^[j];
- pr^^[k + nodeplace[i]^^.pos] := pr^^[j];
- end;
-
- ntot := ntot - (ktot - 1);
-
- for l := 1 to i - 1 do
- if nodeplace[l]^^.stp > nodeplace[i]^^.stp then
- nodeplace[l]^^.stp := nodeplace[l]^^.stp - (ktot - 1);
-
- end;
-
- parser(sy, tokentype, pr, nodetable, nodepointer, error);
-
- ntot := jtot;
-
- if (save[2] = equals) then
- store := true;
-
- 999:
-
- for k := 1 to numnodeplaces do
- DisposHandle(handle(nodeplace[k]));
-
- DisposHandle(handle(numplaces));
- DisposHandle(handle(nst));
- DisposHandle(handle(nend));
- DisposHandle(handle(sysub));
- DisposHandle(handle(subtokentype));
- DisposHandle(handle(subpr));
-
- end;
-
- end.